package com.goldrepo.play.common;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;

/**
 * <p>Description: Demo</p>
 *                 Status枚举用于保存状态
 *                 data使用泛型，可以存储任何类型对象
 *                 错误信息通过error获得
 *                 在反序列化时，Jackson默认会调用对象的无参构造函数
 *                 如果没有定义任何构造函数，JVM会负责生成默认的无参构造函数
 *                 如果定义了构造函数并且没有提供无参构造函数时，Jackson会报错，加上@JsonCreator则可以指定对象在反序列化时的构造函数
 *                 @JsonCreator只能用在静态方法或者构造方法
 *
 *
 * @author Goldrepo
 * @date 2022-05-10 18:41
 **/
public final class ApiResponse<T> {

    private ErrorResponse error;
    private T data;
    private Status status;

    private ApiResponse(ErrorResponse error, Status status) {
        this.error = error;
        this.status = status;
    }

    private ApiResponse(T data, Status status) {
        this.data = data;
        this.status = status;
    }

    @JsonCreator
    public static <T> ApiResponse<T> success(@JsonProperty("status") Status status, @JsonProperty("data") T data){
        return new ApiResponse<>(data, status);
    }

    @JsonCreator
    public static <T> ApiResponse<T> error(@JsonProperty("status") Status status, @JsonProperty("error") ErrorResponse error){
        return new ApiResponse<>(error, status);
    }

    public enum Status {
        SUCCESS("success"),
        TIMEOUT("timeout"),
        ERROR("error");

        private final String status;

        Status(String status) {
            this.status = status;
        }

        @JsonValue
        public String getStatus() {
            return status;
        }
    }

    public ErrorResponse getError() {
        return error;
    }

    public T getData() {
        return data;
    }

    public Status getStatus() {
        return status;
    }

}
